package main

import "fmt"

type Human struct {
	name string
	sex  string
}

func (this *Human) Eat() {
	fmt.Println("Human.Eat()...")
}

func (this *Human) Walk() {
	fmt.Println("Human.Walk()...")
}

// ==================

type SuperMan struct {
	Human // SuperMan 继承了 Human
	level int
}

// 重新定义父类的方法Eat()
func (this *SuperMan) Eat() {
	fmt.Println("SuperMan.Eat()...")
}

// 子类新方法
func (this *SuperMan) Fly() {
	fmt.Println("SuperMan.Fly()...")
}

func (this *SuperMan) Print() {
	fmt.Println("name = ", this.name)
	fmt.Println("sex = ", this.sex)
	fmt.Println("level = ", this.level)
}

func main() {

	h := Human{"zhang3", "male"}

	h.Eat()
	h.Walk()

	// 定义一个子类对象
	// S := SuperMan{Human{"zhang3", "male"}, 10}
	var s SuperMan
	s.name = "Jackson"
	s.sex = "famale"
	s.level = 10

	s.Walk() // 调用父类方法
	s.Eat()  // 子类方法
	s.Fly()  // 子类方法

	s.Print()

}
